#pragma once
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string>

class InetAddr
{
    private:
    void PortNet2Host()
    {
        _port=::ntohs(_addr.sin_port);
    }

    void IpNet2Host()
    {
        char ip[64];
        ::inet_ntop(AF_INET, &_addr.sin_addr, ip, sizeof(ip));
        _ip = std::string(ip);
    }
public:
    InetAddr()
    {
    }

    InetAddr(const struct sockaddr_in &addr)
    :_addr(addr)
    {
        PortNet2Host(); // 将网络字节序的端口转换为主机字节序
        IpNet2Host();   // 将网络字节序的IP地址转换为主机字节序
    }

    InetAddr(const uint16_t port)
    :_port(port),
    _ip("")
    {
        _addr.sin_family=AF_INET; // 设置地址族为IPv4
        _addr.sin_port=htons(port); // 将端口转换为网络字节序
        _addr.sin_addr.s_addr=INADDR_ANY; // 设置IP地址为任
    }

    ~InetAddr()
    {
    }

    struct sockaddr* Getsockaddr()
    {
        return (struct sockaddr*)&_addr;
    }

    size_t GetSockaddrLen()
    {
        return sizeof(_addr);
    }

    std::string GetIp()
    {
        return _ip;
    }

    uint16_t GetPort()
    {
        return _port;
    }


private:
    struct sockaddr_in _addr; // 用于存储IP地址和端口号的结构体
    std::string _ip;
    uint16_t _port;
};